
package servidorchat;

import java.io.*;
import java.net.*;
import javax.swing.JOptionPane;
	
public class ServidorChat {
	
	public static final int PUERTO = 2500;
	
	protected static final int TIEMPO_DESCONEXION_AUTOMATICA = 600000;
	
	private ServerSocket socketServidor;

        private VentanaPrincipal frame;

        public static boolean estado;
		
	public ServidorChat(VentanaPrincipal vp){
		frame = vp;
                estado = false;
	}

        public void inicializaServidor(){
         frame.escribirComando("Arrancando servidor por el puerto " + PUERTO);
		arrancarServidor();
               /* try{
			Thread.sleep(3000);
		}catch(InterruptedException exe){
			exe.printStackTrace();
		}*/
		procesarClientes();
        }

	private void arrancarServidor(){
		
		try{
			socketServidor = new ServerSocket(PUERTO);
                        frame.escribirComando("\nEl Servidor esta en marcha, escucha por el puerto : " + PUERTO);
			frame.iniciarServidor();
                        estado = true;
		}catch(BindException e1){
			String msg_error = "No puede arrancarse el servidor por el puerto " + PUERTO + " .Seguramente el puerto esta ocupado!";
			errorFatal(e1,msg_error);
		}catch(SecurityException e2){
			String msg_error = "No puede arrancarse el servidor por el puerto " + PUERTO + " .Seguramente hay restricciones de seguridad!";
			errorFatal(e2,msg_error);
		}catch(IOException e3){
			String msg_error = "No puede arrancarse el servidor por el puerto " + PUERTO ;
			errorFatal(e3,msg_error);
		}
	}

        public void pararServidor() throws IOException{

            socketServidor.close();
            socketServidor = null;
            frame.escribirComando("\nServidor parado!!\n");
            frame.iniciarServidor();
            estado = false;
        }

	private void procesarClientes(){
		Socket socketCliente = null;
		
		while(estado){
                    if(estado){
                        try{
				socketCliente = socketServidor.accept();
				try{
					new ThreadServidor(socketCliente);
				}catch(IOException e1){
					if(socketCliente != null){
						try{
							socketCliente.close();
						}catch(IOException e2){;}
					}
				}
			}catch(SecurityException e3){
				if(socketServidor != null){
						try{
							socketServidor.close();
						}catch(IOException e4){;}
				}
				String msg_error = "Con su configuracion de seguridad, lo clientes no pueden conectarse por el puerto :  " + PUERTO ;
				errorFatal(e3,msg_error);
			}catch(IOException e5){

			}
                    }
			
		}
	}
	
	private void errorFatal(Exception excepcion, String mensajeError){
		excepcion.printStackTrace();
		JOptionPane.showMessageDialog(null,"Error Fatal." + System.getProperty("line.separator") + mensajeError,"Informacion para el Usuario",JOptionPane.WARNING_MESSAGE);
		System.exit(-1);
	}
	
}
